package dp.leetcode_337_medium_treedp;

public class BestSolutionRob {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(3);
        root.left.right = new TreeNode(1);
        int rob = new BestSolutionRob().rob(root);
        System.out.println(rob);
    }

    public int rob(TreeNode root) {
        int[] dp = dfs(root);
        return Math.max(dp[0], dp[1]);
    }

    public int[] dfs(TreeNode root) {
        if (root == null) {
            return new int[]{0, 0};
        }
        //后序遍历，每一个节点都获取其 偷/不偷 所偷取的最大金额     0代表不偷当前 | 1代表偷当前
        int[] left = dfs(root.left);
        int[] right = dfs(root.right);

        int[] dp = new int[2];
        //dp[0]：偷以 root 为根的子树所能偷取的最大金额，不能偷 root 节点
        //dp[1]：偷以 root 为根的子树所能偷取的最大金额，root 节点可以偷
        dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        //偷当前节点，则当前节点的孩子不能偷; 当前节点金额 + 不偷孩子节点时，孩子节点所能偷取的最大金额
        dp[1] = root.val + left[0] + right[0];
        return dp;
    }
}
